#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @time: 2022-08-08 10:44:21
# @author: 鹰眼测试

"""
parametrize参数化组件接收数组（列表）：[[title_1, method_1], [title_2, method_2], [title_3, method_3]]
但我们YAML文件，读取出来的数据是对象（字典）：{case_1: {title: xx, method: xxx}, case_2: {title: xx, method: xxx}}
所以，我们需要将"对象"转换成"数组"
SetRequestData主要的功能，无法就是将我们YAML"对象"转换成"数组"
"""


from Utils.dataUtils.yamlUtility import YAMLOption
from Utils.requestUtils.mergeUrl import merge_utl


class SetRequestData:
    def __init__(self, file):
        # 获取整个YAML文件的数据
        self.data = YAMLOption(file).read_yaml()
        # 创建一个空列表，列表用来存储我们的用例：[ [], [], [] ]  外面那个大数组，就是self.cases
        self.cases = []

    @classmethod
    def is_title(cls, case_name, case_value):
        """
        一个完整的用例数据是这样的：case_1: {title: xx, method: xxx}（这是示例，别较真。这个对象具体是怎么样的，取决于你怎么写yaml文本）
        :param case_name: case_1
        :param case_value: {title: xx, method: xxx}
        :return: 判断用户是否有在数据中写入title，如果没写的话，就取case_name作为用例标题
        """
        if "title" not in case_value:
            return case_name
        else:
            return case_value["title"]

    @classmethod
    def is_request_path(cls, case_value):
        """
        将user.conf.yaml的host和用户输入的"请求路径"拼接起来
        一个完整的用例数据是这样的：case_1: {path: xx, method: xxx}
        :param case_value: {path: xx, method: xxx}
        :return: 判断用户是否有在数据中写入path，如果写了，那就是"host/path"这种格式，如果没写的话，只返回host
        """
        if "path" in case_value:
            return merge_utl(case_value["path"])
        else:
            return merge_utl(None)

    @classmethod
    def is_method(cls, case_value):
        """
        一个完整的用例数据是这样的：case_1: {method: xx, header: xxx}
        :param case_value: {method: xx, header: xxx}
        :return: 判断用户是否有在数据中写入method，如果没写的话，就返回None
        """
        if "method" in case_value:
            return case_value["method"]

    @classmethod
    def is_header(cls, case_value):
        """
        一个完整的用例数据是这样的：case_1: {header: xx, method: xxx}
        :param case_value: {header: xx, method: xxx}
        :return: 判断用户是否有在数据中写入header，如果没写的话，就返回None
        """
        if "header" in case_value:
            return case_value["header"]

    @classmethod
    def is_params(cls, case_value):
        """
        一个完整的用例数据是这样的：case_1: {params: xx, method: xxx}
        :param case_value: {params: xx, method: xxx}
        :return: 判断用户是否有在数据中写入params，如果没写的话，就返回None
        """
        if "params" in case_value:
            return case_value["params"]

    @classmethod
    def is_assert(cls, case_value):
        if "assert" in case_value:
            return case_value["assert"]
        else:
            return "True"

    def set_case(self):
        """
        :return: 将处理好的数据都放到self.cases这个大数组（列表）中，让TestCase里面的用例文件来调用
        """
        for case_name, case_value in self.data.items():
            title = self.is_title(case_name, case_value)
            url = self.is_request_path(case_value)
            method = self.is_method(case_value)
            header = self.is_header(case_value)
            paras = self.is_params(case_value)
            is_assert = self.is_assert(case_value)
            case = [title, url, method, header, paras, is_assert]
            self.cases.append(case)
        return self.cases
